package com.ssd.service.impl;

import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssd.api.payment.dto.enums.RefundStatusEnum;
import com.ssd.mapper.RefundRecordMapper;
import com.ssd.model.domain.RefundRecord;
import com.ssd.service.RefundRecordService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 退款记录服务实现类
 * 提供与退款记录相关的各种操作，如根据退款编号查询记录，根据交易订单号查询记录等
 */
@Service
public class RefundRecordServiceImpl extends ServiceImpl<RefundRecordMapper, RefundRecord> implements RefundRecordService {

    /**
     * 根据退款编号查询退款记录
     *
     * @param refundNo 退款编号
     * @return 对应的退款记录，如果不存在则返回null
     */
    @Override
    public RefundRecord findByRefundNo(Long refundNo) {
        // 创建查询条件构造器
        LambdaQueryWrapper<RefundRecord> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件：根据退款编号等于给定的退款编号
        queryWrapper.eq(RefundRecord::getRefundNo, refundNo);
        // 执行查询并返回结果
        return super.getOne(queryWrapper);
    }

    /**
     * 根据交易订单号查询退款记录列表
     *
     * @param tradingOrderNo 交易订单号
     * @return 对应的退款记录列表，按照创建时间降序排列
     */
    @Override
    public List<RefundRecord> findByTradingOrderNo(Long tradingOrderNo) {
        // 创建查询条件对象
        LambdaQueryWrapper<RefundRecord> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件为交易订单号等于传入参数
        queryWrapper.eq(RefundRecord::getTradingOrderNo, tradingOrderNo);
        // 设置查询结果按创建时间降序排序
        queryWrapper.orderByDesc(RefundRecord::getCreateTime);
        // 执行查询并返回结果列表
        return super.list(queryWrapper);
    }

    /**
     * 根据商品订单号和商品应用ID查询退款记录列表
     *
     * @param productAppId 商品应用ID
     * @param productOrderNo 商品订单号
     * @return 对应的退款记录列表，按照创建时间降序排列
     */
    @Override
    public List<RefundRecord> findListByProductOrderNo(String productAppId,Long productOrderNo) {
        // 创建查询条件对象
        LambdaQueryWrapper<RefundRecord> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件：根据商品订单号和商品应用ID进行查询
        queryWrapper.eq(RefundRecord::getProductOrderNo, productOrderNo)
                        .eq(RefundRecord::getProductAppId, productAppId);
        // 设置排序条件：按照创建时间降序排列
        queryWrapper.orderByDesc(RefundRecord::getCreateTime);
        // 执行查询并返回结果
        return super.list(queryWrapper);
    }

    /**
     * 根据退款状态查询退款记录列表
     * 仅返回指定数量的记录，并且保证返回列表的大小不超过10条记录
     *
     * @param refundStatus 退款状态
     * @param count 期望获取的记录数量，实际数量将不超过此值且最大为10
     * @return 对应的退款记录列表，按照创建时间升序排列
     */
    @Override
    public List<RefundRecord> findListByRefundStatus(RefundStatusEnum refundStatus, Integer count) {
        // 确保查询的数量不超过10条，这是一个业务规则，以防止查询结果过多
        count = NumberUtil.max(count, 10);
        LambdaQueryWrapper<RefundRecord> queryWrapper = new LambdaQueryWrapper<>();
        // 构造查询条件，按照退款状态查询并按照创建时间升序排列，最后应用数量限制
        queryWrapper.eq(RefundRecord::getRefundStatus, refundStatus)
                .orderByAsc(RefundRecord::getCreateTime)
                .last("LIMIT " + count);
        // 执行查询并返回结果列表
        return list(queryWrapper);
    }
}

